﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CAOS.Entity;

namespace CAOS.Facade
{
    public class AcessoFacade
    {
        UnityOfWork.UnidadeDeTrabalho UnidadeDeTrabalho = null;
        UsuarioFacade usuarioFacade = null;

        public AcessoFacade(UnityOfWork.UnidadeDeTrabalho unidadeDeTrabalho)
        {
            this.UnidadeDeTrabalho = unidadeDeTrabalho;
            usuarioFacade = new UsuarioFacade(UnidadeDeTrabalho);
        }

        public bool VerificarPermissaoRecursoUsuario(string siglaSistema, string loginUsuario, string codigoRecurso)
        {
            Usuario usuario = this.usuarioFacade.LerUsuario(loginUsuario);

            if (usuario == null)
            {
                return false;
            }

            bool possuiAcesso = false;

            foreach (Papel papel in usuario.Papeis)
            {
                possuiAcesso = papel.RecursosPermitidos.Any(r => r.Nome.Equals(codigoRecurso, StringComparison.CurrentCultureIgnoreCase));
            }

            return possuiAcesso;
        }

        public bool VerificarPermissaoRecursoPapel(string siglaSistema, string codigoRecurso, string nomePapel)
        {
            bool possuiAcesso = false;

            Papel papel = UnidadeDeTrabalho.PapelRepository.GetByCondition(p => p.Nome == nomePapel && p.Sistema.Sigla == siglaSistema);
            possuiAcesso = papel.RecursosPermitidos.Any(r => r.Codigo.Equals(codigoRecurso, StringComparison.CurrentCultureIgnoreCase));

            return possuiAcesso;
        }

        public bool SistemaAutenticado(Sistema sistema)
        {
            return UnidadeDeTrabalho.SistemaRepository.Exists(s =>
                                                                s.Sigla.Equals(sistema.Sigla, StringComparison.InvariantCultureIgnoreCase) &&
                                                                s.CodigoAutenticacao.Equals(sistema.CodigoAutenticacao)
                                                              );
        }

        public bool AutenticarUsuario(string loginUsuario, string senha, Sistema sistema)
        {
            Usuario usuario = usuarioFacade.LerUsuario(loginUsuario, senha);

            if (usuario == null)
            {
                return false;
            }

            bool usuarioAutenticado = usuario.Papeis.Where(p => p.Sistema.Sigla == sistema.Sigla).Any();

            if (usuarioAutenticado)
            {
                UnidadeDeTrabalho.LogRepository.Insert(new TrilhaAuditoria()
                {
                    Usuario = usuario,
                    Sistema = sistema,
                    DescricaoOperacaoExecutada = "Autenticou-se no sistema.",
                    DataOperacao = DateTime.Now
                });
            }

            return usuarioAutenticado;
        }

        public IList<Sistema> ObterSistemasAdministrados(string loginUsuario)
        {
            Usuario usuario = usuarioFacade.LerUsuario(loginUsuario);

            if (usuario == null || usuario.Papeis == null)
            {
                return null;
            }

            if (usuario.IsAdministradorCAOS)
            {
                return UnidadeDeTrabalho.SistemaRepository.List().ToList();
            }
            else
            {
                IList<Sistema> sistemasAdministrados = usuario.Papeis.Where(p => p.IsPapelGestor == true).Select(p => p.Sistema).ToList();
                return sistemasAdministrados;
            }
        }
    }
}
